#include<iostream>
using namespace std;
#include<cstring>
#include<math.h>

/*友元：友元函数，友元类
1.定义：类的友元函数是定义在类外部，但有权访问类的所有私有（private）成员和保护（protected）成员。
		尽管友元函数的原型有在类的定义中出现过，但是友元函数并不是成员函数。
2.友元类：友元类的所有成员函数都是另一个类的友元函数，都可以访问另一个类中的隐藏信息（包括私有成员和保护成员）。
3.注意：
  （1）友元函数定义在类的外部，但也可以定义在类内，只是一般都是定义在类外的。
  （2）友元函数需要在类内用 friend 声明，但是它并不是成员函数；
  （3）要注意区分 成员函数，全局函数，友元函数；
  （4）友元函数与友元类都是单向的，且不具有继承性。
       即A是B的友元类，则A可以访问B的所有成员与函数，但是B不能访问A的任何成员与函数。---> 单向性
	   即A是B的友元类，B是C的友元类，不可以认为A是C的友元类。---> 不具有继承性
*/

/*class stu
{
	char name[20];
	int age;
public:
	stu(char* n, int a)
	{
		strcpy(name, n);
		age = a;
	}
	void show1()
	{
		cout<<"年龄："<<age<<endl;
	}
	int getage()
	{
		return age;
	}
	friend void show3();//在类内使用关键字 friend 声明友元函数
	friend class teach;// teach类是stu类友元类
};

class teach
{
	int age;
public:
	void fun1(){};
	void fun2(){};
};

//全局函数
void show2()
{
	stu s2("lisi", 18);
	cout<<"年龄："<<s2.getage()<<endl;
}

//友元函数
void show3()
{
	stu s3("wangwu", 24);
	cout<<s3.age<<endl;
}

int main()
{
	stu s1("zhangsan", 20);
	s1.show1();//使用成员函数显示年龄
	
	show2();//使用全局函数显示年龄
	
	show3();//使用友元函数显示年龄
	return 0;
}*/

//练习：用三种函数求两点之间的距离
/*
class point
{
	int x;
	int y;
	double D;
public:
	point(int a, int b)
	{
		x = a;
		y = b;
	}
	void distance1(const point &p)
	{
		D = sqrt((x - p.x) * (x - p.x) + (y - p.y) * (y - p.y));
		cout<<"两点之间的距离："<<D<<endl;
	}
	int getx()
	{
		return x;
	}
	int gety()
	{
		return y;
	}
	friend void distance3(point &p1, point &p2);
};

//全局函数
void distance2(point &p1, point &p2)
{
	double d = sqrt((p1.getx() - p2.getx()) * (p1.getx() - p2.getx()) + (p1.gety() - p2.gety()) * (p1.gety() - p2.gety()));
	cout<<"两点之间的距离："<<d<<endl;
}

//友元函数
void distance3(point &p1, point &p2)
{
	double d = sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
	cout<<"两点之间的距离："<<d<<endl;
}

int main()
{
	point p1(2, 4), p2(3, 5);
	p1.distance1(p2);//成员函数
	distance2(p1, p2);//全局函数
	distance3(p1, p2);//友元函数
}
*/
